package com.atguigu.tingshu.album.service.impl;

import com.atguigu.tingshu.album.mapper.AlbumAttributeValueMapper;
import com.atguigu.tingshu.album.mapper.AlbumInfoMapper;
import com.atguigu.tingshu.album.mapper.AlbumStatMapper;
import com.atguigu.tingshu.album.service.AlbumInfoService;
import com.atguigu.tingshu.common.constant.SystemConstant;
import com.atguigu.tingshu.model.album.AlbumAttributeValue;
import com.atguigu.tingshu.model.album.AlbumInfo;
import com.atguigu.tingshu.model.album.AlbumStat;
import com.atguigu.tingshu.query.album.AlbumInfoQuery;
import com.atguigu.tingshu.vo.album.AlbumAttributeValueVo;
import com.atguigu.tingshu.vo.album.AlbumInfoVo;
import com.atguigu.tingshu.vo.album.AlbumListVo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.util.Collections;
import java.util.List;

@Slf4j
@Service
@SuppressWarnings({"unchecked", "rawtypes"})
public class AlbumInfoServiceImpl extends ServiceImpl<AlbumInfoMapper, AlbumInfo> implements AlbumInfoService {

	@Autowired
	private AlbumInfoMapper albumInfoMapper;
    @Autowired
    private AlbumAttributeValueMapper albumAttributeValueMapper;

	@Autowired
	private AlbumStatMapper albumStatMapper;

	/**
	 * 保存专辑信息
	 *
	 * @param albumInfoVo 专辑信息对象，包含专辑的基本信息和属性信息
	 * @param userId 用户ID
	 * @throws Exception 如果保存过程中出现任何异常，将抛出Exception异常
	 */
	@Override
	@Transactional(rollbackFor = Exception.class)
	public void saveAlbumInfo(AlbumInfoVo albumInfoVo, Long userId) {

		// 创建一个AlbumInfo对象
		AlbumInfo albumInfo = new AlbumInfo();
		// 将AlbumInfoVo对象的属性复制到AlbumInfo对象中
		BeanUtils.copyProperties(albumInfoVo, albumInfo);
		// 设置专辑的用户ID
		albumInfo.setUserId(userId);
		// 设置专辑的状态为通过
		albumInfo.setStatus(SystemConstant.ALBUM_STATUS_PASS);

		// 获取专辑的付费类型
		String payType = albumInfoVo.getPayType();
		// 如果付费类型不是免费，则设置专辑的免费曲目数量为5
		if (!SystemConstant.ALBUM_PAY_TYPE_FREE.equals(payType)) {
			albumInfo.setTracksForFree(5);
		}

		// 保存专辑信息到数据库
		save(albumInfo);

		// 获取专辑属性值的列表
		List<AlbumAttributeValueVo> albumAttributeValueVoList = albumInfoVo.getAlbumAttributeValueVoList();
		// 如果专辑属性值的列表不为空
		if (!CollectionUtils.isEmpty(albumAttributeValueVoList)) {
			// 遍历专辑属性值的列表
			albumAttributeValueVoList.stream().forEach(albumAttributeValueVo -> {
				// 创建一个AlbumAttributeValue对象
				AlbumAttributeValue albumAttributeValue = new AlbumAttributeValue();
				// 将AlbumAttributeValueVo对象的属性复制到AlbumAttributeValue对象中
				BeanUtils.copyProperties(albumAttributeValueVo, albumAttributeValue);
				// 设置专辑属性值的专辑ID
				albumAttributeValue.setAlbumId(albumInfo.getId());
				// 将专辑属性值保存到数据库
				albumAttributeValueMapper.insert(albumAttributeValue);
			});
		}

		// 保存专辑的播放统计信息
		this.saveAlbumStat(albumInfo.getId(),SystemConstant.ALBUM_STAT_PLAY);
		// 保存专辑的订阅统计信息
		this.saveAlbumStat(albumInfo.getId(),SystemConstant.ALBUM_STAT_SUBSCRIBE);
		// 保存专辑的浏览统计信息
		this.saveAlbumStat(albumInfo.getId(),SystemConstant.ALBUM_STAT_BROWSE);
		// 保存专辑的评论统计信息
		this.saveAlbumStat(albumInfo.getId(),SystemConstant.ALBUM_STAT_COMMENT);

	}

	/**
	 * 分页查询用户专辑信息
	 *
	 * @param page 当前页码
	 * @param limit 每页显示数量
	 * @param albumInfoQuery 查询条件
	 * @return 返回包含用户专辑信息的分页对象
	 */
	@Override
	public IPage<AlbumListVo> findUserAlbumPage(Long page, Long limit, AlbumInfoQuery albumInfoQuery) {
		// 创建一个分页对象，设置当前页码和每页显示的记录数
		IPage<AlbumListVo> pageInfo = new Page(page, limit);
		// 调用albumInfoMapper的findUserAlbumPage方法，传入分页对象和查询条件，获取分页查询结果
		return albumInfoMapper.findUserAlbumPage(pageInfo, albumInfoQuery);
	}

	/**
	 * 根据专辑ID删除专辑信息及其相关联的专辑属性值和专辑统计信息
	 *
	 * @param id 专辑的ID
	 * @throws Exception 如果删除过程中出现异常，则抛出异常，并回滚事务
	 */
	@Override
	// 声明该方法在事务环境下执行，若发生异常则回滚
	@Transactional(rollbackFor = Exception.class)
	public void removeAlbumInfoById(Long id) {
		// 删除对应的专辑信息
		this.removeById(id);
		// 删除与该专辑ID相关联的专辑属性值
		albumAttributeValueMapper.delete(new LambdaQueryWrapper<AlbumAttributeValue>().eq(AlbumAttributeValue::getAlbumId, id));
		// 删除与该专辑ID相关联的专辑统计信息
		albumStatMapper.delete(new LambdaQueryWrapper<AlbumStat>().eq(AlbumStat::getAlbumId, id));
	}

	/**
	 * 根据专辑ID获取专辑信息及其属性值列表
	 *
	 * @param id 专辑ID
	 * @return 包含专辑信息及属性值列表的AlbumInfo对象，若未找到对应专辑信息则返回null
	 */
	@Override
	public AlbumInfo getAlbumInfoById(Long id) {
		// 通过专辑ID获取专辑信息
		AlbumInfo albumInfo = this.getById(id);
		// 判断获取的专辑信息是否为空
		if (albumInfo != null) {
			// 根据专辑ID查询属性值列表
			List<AlbumAttributeValue> albumAttributeValueList = albumAttributeValueMapper.selectList(new LambdaQueryWrapper<AlbumAttributeValue>().eq(AlbumAttributeValue::getAlbumId, id));
			// 将属性值列表设置到专辑信息对象中
			albumInfo.setAlbumAttributeValueVoList(albumAttributeValueList);
		}
		// 返回专辑信息对象
		return albumInfo;
	}

	/**
	 * 根据专辑ID更新专辑信息及其属性值
	 *
	 * @param id 专辑ID
	 * @param albumInfoVo 包含更新后的专辑信息和属性值列表的VO对象
	 */
	@Override
	public void updateAlbumInfoById(Long id, AlbumInfoVo albumInfoVo) {
		// 根据专辑ID获取专辑信息
		AlbumInfo albumInfo = this.getById(id);
		// 将VO对象的属性复制到实体对象中
		BeanUtils.copyProperties(albumInfoVo, albumInfo);
		// 更新专辑信息
		this.updateById(albumInfo);

		// 删除该专辑ID对应的所有属性值记录
		albumAttributeValueMapper.delete(new LambdaQueryWrapper<AlbumAttributeValue>().eq(AlbumAttributeValue::getAlbumId, id));

		// 获取更新后的属性值列表
		List<AlbumAttributeValueVo> albumAttributeValueVoList = albumInfoVo.getAlbumAttributeValueVoList();
		// 如果属性值列表不为空
		if (!CollectionUtils.isEmpty(albumAttributeValueVoList)) {
			// 遍历属性值列表
			albumAttributeValueVoList.stream().forEach(albumAttributeValueVo -> {
				// 创建一个新的属性值实体对象
				AlbumAttributeValue albumAttributeValue = new AlbumAttributeValue();
				// 将VO对象的属性复制到实体对象中
				BeanUtils.copyProperties(albumAttributeValueVo, albumAttributeValue);
				// 设置专辑ID
				albumAttributeValue.setAlbumId(id);
				// 插入新的属性值记录
				albumAttributeValueMapper.insert(albumAttributeValue);
			});
		}
	}

	/**
	 * 根据用户ID查询用户所有相册列表
	 *
	 * @param userId 用户ID
	 * @return 用户所有相册列表
	 */
	@Override
	public List<AlbumInfo> findUserAllAlbumList(Long userId) {
		// 创建一个LambdaQueryWrapper对象，用于构建查询条件
		LambdaQueryWrapper<AlbumInfo> albumInfoLambdaQueryWrapper = new LambdaQueryWrapper<>();
		// 设置查询条件：userId等于传入的userId
		albumInfoLambdaQueryWrapper.eq(AlbumInfo::getUserId, userId);
		// 设置查询的字段：只查询id和albumTitle字段，并按id升序排序
		albumInfoLambdaQueryWrapper.select(AlbumInfo::getId, AlbumInfo::getAlbumTitle).orderByAsc(AlbumInfo::getId);
		// 执行查询，返回查询结果列表
		return albumInfoMapper.selectList(albumInfoLambdaQueryWrapper);
	}



	/**
	 * 初始化统计数据
	 * @param albumId
	 * @param statType
	 */
	private void saveAlbumStat(Long albumId,String statType){
		// 创建一个新的AlbumStat对象
		AlbumStat albumStat = new AlbumStat();

		// 设置albumId
		albumStat.setAlbumId(albumId);

		// 设置statType
		albumStat.setStatType(statType);

		// 设置statNum为0
		albumStat.setStatNum(0);

		// 调用albumStatMapper的insert方法将albumStat对象插入数据库
		albumStatMapper.insert(albumStat);
	}

}
